package net.crozz.openapi.qq;

import net.crozz.openapi.ApiException;
import net.crozz.openapi.http.Param;
import net.crozz.openapi.http.Requester;
import net.crozz.openapi.qq.model.t.Resp_add_t;
import net.crozz.openapi.qq.model.t.Resp_del_t;
import net.crozz.openapi.qq.model.t.Resp_get_repost_list;

public class T {

    private final Requester client;
    private final String    baseURL;
    private final String    client_id;

    T(Requester client, String baseURL, String client_id) {
        this.client = client;
        this.baseURL = baseURL;
        this.client_id = client_id;
    }


    /**
     * 发表一条微博信息（纯文本）到腾讯微博平台上。<br/>
     * 注意连续两次发布的微博内容不可以重复。
     * 文档地址：http://wiki.connect.qq.com/add_t
     *
     * @param access_token   可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid         用户的ID，与QQ号码一一对应。
     * @param content        表示要发表的微博内容。必须为UTF-8编码，最长为140个汉字，也就是420字节。
     *                       如果微博内容中有URL，后台会自动将该URL转换为短URL，每个URL折算成11个字节。
     *                       若在此处@好友，需正确填写好友的微博账号，而非昵称。
     * @param clientip       用户ip。
     *                       必须正确填写用户侧真实ip，不能为内网ip及以127或255开头的ip，以分析用户所在地。
     * @param longitude      用户所在地理位置的经度。
     *                       为实数，最多支持10位有效数字。有效范围：-180.0到+180.0，+表示东经，默认为0.0。
     * @param latitude       用户所在地理位置的纬度。
     *                       为实数，最多支持10位有效数字。有效范围：-90.0到+90.0，+表示北纬，默认为0.0。
     * @param compatibleflag 容错标志，支持按位操作，默认为0。
     *                       0x20：微博内容长度超过140字则报错；
     *                       0：以上错误均做容错处理，即发表普通微博。
     */
    public Resp_add_t add_t(String access_token, String openid, String content, String clientip, String longitude, String latitude, String compatibleflag) throws ApiException {
        return client.postObj(
                Resp_add_t.class,
                baseURL + "t/add_t",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("content", content),
                Param.newParam("clientip", clientip),
                Param.newParam("longitude", longitude),
                Param.newParam("latitude", latitude),
                Param.newParam("compatibleflag", compatibleflag),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 发表一条微博信息（纯文本）到腾讯微博平台上。<br/>
     * 注意连续两次发布的微博内容不可以重复。<br/>
     * 使用 {@link T} 中的client_id
     * 文档地址：http://wiki.connect.qq.com/add_t
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param content      表示要发表的微博内容。必须为UTF-8编码，最长为140个汉字，也就是420字节。
     *                     如果微博内容中有URL，后台会自动将该URL转换为短URL，每个URL折算成11个字节。
     *                     若在此处@好友，需正确填写好友的微博账号，而非昵称。
     */
    public Resp_add_t add_t(String access_token, String openid, String content) throws ApiException {
        return add_t(access_token, openid, content, null, null, null, null);
    }

    /**
     * 根据微博ID删除指定微博。<br/>
     * 文档地址：http://wiki.connect.qq.com/del_t
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param id           {@link Resp_add_t.Data#id 微博消息的id}
     */
    public Resp_del_t del_t(String access_token, String openid, String id) throws ApiException {
        return client.postObj(
                Resp_del_t.class,
                baseURL + "t/del_t",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("id", id),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 上传一张图片，并发布一条消息到腾讯微博平台上。
     * 文档地址：http://wiki.connect.qq.com/add_pic_t
     *
     * @param access_token   可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid         用户的ID，与QQ号码一一对应。
     * @param content        表示要发表的微博内容。必须为UTF-8编码，最长为140个汉字，也就是420字节。
     *                       如果微博内容中有URL，后台会自动将该URL转换为短URL，每个URL折算成11个字节。
     *                       若在此处@好友，需正确填写好友的微博账号，而非昵称。
     * @param clientip       用户ip。
     *                       必须正确填写用户侧真实ip，不能为内网ip及以127或255开头的ip，以分析用户所在地。
     * @param longitude      用户所在地理位置的经度。
     *                       为实数，最多支持10位有效数字。有效范围：-180.0到+180.0，+表示东经，默认为0.0。
     * @param latitude       用户所在地理位置的纬度。
     *                       为实数，最多支持10位有效数字。有效范围：-90.0到+90.0，+表示北纬，默认为0.0。
     * @param pic            要上传的图片
     *                       图片仅支持gif、jpeg、jpg、png、bmp及ico格式（所有图片都会重新压缩，gif被重新压缩后不会再有动画效果）
     *                       图片size小于4M。
     * @param compatibleflag 容错标志，支持按位操作，默认为0。
     *                       0x20：微博内容长度超过140字则报错；
     *                       0：以上错误均做容错处理，即发表普通微博。
     */
    public Resp_add_t add_pic_t(
            String access_token, String openid,
            String content, byte[] pic, String clientip, String longitude, String latitude, String compatibleflag
    ) throws ApiException {
        return client.multiPartObj(
                Resp_add_t.class,
                baseURL + "t/add_pic_t",
                Param.multiPartParm("pic", "pic", pic),
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("content", content),
                Param.newParam("clientip", clientip),
                Param.newParam("longitude", longitude),
                Param.newParam("latitude", latitude),
                Param.newParam("compatibleflag", compatibleflag),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 上传一张图片，并发布一条消息到腾讯微博平台上。
     * 文档地址：http://wiki.connect.qq.com/add_pic_t
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param content      表示要发表的微博内容。必须为UTF-8编码，最长为140个汉字，也就是420字节。
     *                     如果微博内容中有URL，后台会自动将该URL转换为短URL，每个URL折算成11个字节。
     *                     若在此处@好友，需正确填写好友的微博账号，而非昵称。
     * @param pic          要上传的图片
     *                     图片仅支持gif、jpeg、jpg、png、bmp及ico格式（所有图片都会重新压缩，gif被重新压缩后不会再有动画效果）
     *                     图片size小于4M。
     */
    public Resp_add_t add_pic_t(String access_token, String openid, String content, byte[] pic) throws ApiException {
        return client.multiPartObj(
                Resp_add_t.class,
                baseURL + "t/add_pic_t",
                Param.multiPartParm("pic", "pic", pic),
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("content", content),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 获取一条微博的转播或评论信息列表。
     * 文档地址：http://wiki.connect.qq.com/get_repost_list
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param rootid       转发或点评的源微博的ID。
     * @param flag         标识获取的是转播列表还是点评列表。0：获取转播列表；1：获取点评列表；2：转播列表和点评列表都获取。
     * @param pageflag     分页标识。0：第一页；1：向下翻页；2：向上翻页。
     * @param pagetime     本页起始时间。
     *                     第一页：0；
     *                     向下翻页：上一次请求返回的最后一条记录时间；
     *                     向上翻页：上一次请求返回的第一条记录的时间。
     * @param reqnum       每次请求记录的条数。取值为1-100条。
     * @param twitterid    翻页时使用。第1-100条：0；继续向下翻页：上一次请求返回的最后一条记录id。
     */
    public Resp_get_repost_list get_repost_list(
            String access_token, String openid,
            String rootid, Integer flag, Integer pageflag, String pagetime, Integer reqnum, String twitterid
    ) throws ApiException {
        return client.getObj(
                Resp_get_repost_list.class,
                baseURL + "t/get_repost_list",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("flag", flag),
                Param.newParam("rootid", rootid),
                Param.newParam("pageflag", pageflag),
                Param.newParam("pagetime", pagetime),
                Param.newParam("reqnum", reqnum),
                Param.newParam("twitterid", twitterid),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }

    /**
     * 获取一条微博的转播或评论信息列表。
     * 文档地址：http://wiki.connect.qq.com/get_repost_list
     *
     * @param access_token 可通过使用Authorization_Code获取Access_Token 或来获取。access_token有3个月有效期。
     * @param openid       用户的ID，与QQ号码一一对应。
     * @param rootid       转发或点评的源微博的ID。
     * @param flag         标识获取的是转播列表还是点评列表。0：获取转播列表；1：获取点评列表；2：转播列表和点评列表都获取。
     * @param pageflag     分页标识。0：第一页；1：向下翻页；2：向上翻页。
     * @param reqnum       每次请求记录的条数。取值为1-100条。
     * @param twitterid    翻页时使用。第1-100条：0；继续向下翻页：上一次请求返回的最后一条记录id。
     */
    public Resp_get_repost_list get_repost_list(
            String access_token, String openid,
            String rootid, Integer flag, Integer pageflag, Integer reqnum, String twitterid
    ) throws ApiException {
        return client.getObj(
                Resp_get_repost_list.class,
                baseURL + "t/get_repost_list",
                Param.newParam("access_token", access_token),
                Param.newParam("openid", openid),
                Param.newParam("flag", flag),
                Param.newParam("rootid", rootid),
                Param.newParam("pageflag", pageflag),
                Param.newParam("reqnum", reqnum),
                Param.newParam("twitterid", twitterid),
                Param.newParam("oauth_consumer_key", client_id),
                Param.newParam("format", "json")
        );
    }
}
